# 1.导pymysql包
import pymysql

# 缩进外的finally中访问不到try中(也是下面两个变量)了，所以提取出来，变成全局变量，让其都能访问
conn = None
cursor = None

try:
    # 2.建立与数据库的连接
    conn = pymysql.connect(host='192.168.174.132', port=3306, user='root', password='iTest_2022_mysql', database='test_db',
                           charset='utf8', autocommit=False)  # autocommit=False默认，不自动提交，可以不需要写
    # 3.用连接，创建游标
    cursor = conn.cursor()

    # 4.用游标，execute执行sql语句
    # 4.1 执行insert语句
    # cursor.execute("insert into t_book(id, title,pub_date) values(7, '西游记', '1986-01-01');")  # sql语句结束，要有分号;结束

    # read是mysql的关键字，所以要转义，显示原内容文本，用右上角的``
    # 4.2 执行update语句
    # cursor.execute("update t_book set `read` = `read` +1 where title ='西游记';")

    # 4.3 执行delete语句
    # 删除的，如果在数据库没有，不会报错，只是影响行数是0
    cursor.execute("delete from t_book where title ='西游记';")

    # 可以看到影响的行数，或sql是否执行成功了,affected_rows(),也是数据库的conn.返回
    print('AffectedRows:', conn.affected_rows())
    # AffectedRows: 1
    # AffectedRows: 0

    # 5.提交事务，事务是数据库的事务，所以用conn连接提交，不是用cursor游标
    # 未提交之前，数据库是没有的,不会更新操作原数据
    # 未出错，提交事务commit,否则出错Exception，回滚事务rollback
    # 一般都是手动，用代码提交，这样出错了，还能回滚，如果设置自动提交autocommit，发生错误就无法挽回了，直接改变数据库数据了
    conn.commit()
# ((3, '笑傲江湖', datetime.date(1995, 12, 24), 20, 80, 0), (4, '射雕英雄传2', datetime.date(1980, 5, 1), 12, 34, 0))
except Exception as err:
    print(err)  # 异常信息
    # (1146, "Table 'test_db.t_book1' doesn't exist")
    # 出错，回滚事务
    conn.rollback()
finally:
    # 6.关闭游标cursor
    cursor.close()
    # 7.关闭连接conn
    conn.close()

# 加上异常处理try..except..finally，不会服务器崩溃1是0结束，且能打印异常信息 Process finished with exit code 1
# Process finished with exit code 0
